<!DOCTYPE html>
<style>
#justifySelfBaseline {
    justify-self: baseline;
}

#justifySelfFirstBaseline {
    justify-self: first baseline;
}

#justifySelfLastBaseline {
    justify-self: last baseline;
}

#justifySelfStretch {
    justify-self: stretch;
}

#justifySelfNormal {
    justify-self: normal;
}

#justifySelfStart {
    justify-self: start;
}

#justifySelfEnd {
    justify-self: end;
}

#justifySelfCenter {
    justify-self: center;
}

#justifySelfSelfStart {
    justify-self: self-start;
}

#justifySelfSelfEnd {
    justify-self: self-end;
}

#justifySelfLeft {
    justify-self: left;
}

#justifySelfRight {
    justify-self: right;
}

#justifySelfFlexStart {
    justify-self: flex-start;
}

#justifySelfFlexEnd {
    justify-self: flex-end;
}

#justifySelfUnsafeEnd {
    justify-self: unsafe end ;
}

#justifySelfUnsafeCenter {
    justify-self: unsafe center ;
}

#justifySelfSafeSelfEnd {
    justify-self: safe self-end;
}

#justifySelfSafeSelfStart {
    justify-self: safe self-start;
}

#justifySelfSafeRight {
    justify-self: safe right;
}

#justifySelfUnsafeLeft {
    justify-self: unsafe left;
}

#justifySelfUnsafeFlexStart {
    justify-self: unsafe flex-start;
}

#justifySelfSafeFlexEnd {
    justify-self: safe flex-end;
}
</style>
<p>Test that setting and getting justify-self works as expected</p>
<div id="justifySelfBaseline"></div>
<div id="justifySelfFirstBaseline"></div>
<div id="justifySelfLastBaseline"></div>
<div id="justifySelfStretch"></div>
<div id="justifySelfNormal"></div>
<div id="justifySelfStart"></div>
<div id="justifySelfEnd"></div>
<div id="justifySelfCenter"></div>
<div id="justifySelfSelfStart"></div>
<div id="justifySelfSelfEnd"></div>
<div id="justifySelfLeft"></div>
<div id="justifySelfRight"></div>
<div id="justifySelfFlexStart"></div>
<div id="justifySelfFlexEnd"></div>

<div id="justifySelfUnsafeEnd"></div>
<div id="justifySelfUnsafeCenter"></div>
<div id="justifySelfSafeSelfEnd"></div>
<div id="justifySelfSafeSelfStart"></div>
<div id="justifySelfSafeRight"></div>
<div id="justifySelfUnsafeLeft"></div>
<div id="justifySelfUnsafeFlexStart"></div>
<div id="justifySelfSafeFlexEnd"></div>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="resources/alignment-parsing-utils-th.js"></script>
<script>
test(function() {
    var justifySelfBaseline = document.getElementById("justifySelfBaseline");
    checkValues(justifySelfBaseline, "justifySelf", "justify-self", "", "baseline");
    var justifySelfFirstBaseline = document.getElementById("justifySelfFirstBaseline");
    checkValues(justifySelfFirstBaseline, "justifySelf", "justify-self", "", "baseline");
    var justifySelfLastBaseline = document.getElementById("justifySelfLastBaseline");
    checkValues(justifySelfLastBaseline, "justifySelf", "justify-self", "", "last baseline");
    var justifySelfStretch = document.getElementById("justifySelfStretch");
    checkValues(justifySelfStretch, "justifySelf", "justify-self", "", "stretch");
    var justifySelfNormal = document.getElementById("justifySelfNormal");
    checkValues(justifySelfNormal, "justifySelf", "justify-self", "", "normal");
    var justifySelfStart = document.getElementById("justifySelfStart");
    checkValues(justifySelfStart, "justifySelf", "justify-self", "", "start");
    var justifySelfEnd = document.getElementById("justifySelfEnd");
    checkValues(justifySelfEnd, "justifySelf", "justify-self", "", "end");
    var justifySelfCenter = document.getElementById("justifySelfCenter");
    checkValues(justifySelfCenter, "justifySelf", "justify-self", "", "center");
    var justifySelfSelfEnd = document.getElementById("justifySelfSelfEnd");
    checkValues(justifySelfSelfEnd, "justifySelf", "justify-self", "", "self-end");
    var justifySelfSelfStart = document.getElementById("justifySelfSelfStart");
    checkValues(justifySelfSelfStart, "justifySelf", "justify-self", "", "self-start");
    var justifySelfLeft = document.getElementById("justifySelfLeft");
    checkValues(justifySelfLeft, "justifySelf", "justify-self", "", "left");
    var justifySelfRight = document.getElementById("justifySelfRight");
    checkValues(justifySelfRight, "justifySelf", "justify-self", "", "right");
    var justifySelfFlexStart = document.getElementById("justifySelfFlexStart");
    checkValues(justifySelfFlexStart, "justifySelf", "justify-self", "", "flex-start");
    var justifySelfFlexEnd = document.getElementById("justifySelfFlexEnd");
    checkValues(justifySelfFlexEnd, "justifySelf", "justify-self", "", "flex-end");

    var justifySelfUnsafeEnd = document.getElementById("justifySelfUnsafeEnd");
    checkValues(justifySelfUnsafeEnd, "justifySelf", "justify-self", "", "unsafe end");
    var justifySelfUnsafeCenter = document.getElementById("justifySelfUnsafeCenter");
    checkValues(justifySelfUnsafeCenter, "justifySelf", "justify-self", "", "unsafe center");
    var justifySelfSafeSelfEnd = document.getElementById("justifySelfSafeSelfEnd");
    checkValues(justifySelfSafeSelfEnd, "justifySelf", "justify-self", "", "safe self-end");
    var justifySelfSafeSelfStart = document.getElementById("justifySelfSafeSelfStart");
    checkValues(justifySelfSafeSelfStart, "justifySelf", "justify-self", "", "safe self-start");
    var justifySelfSafeRight = document.getElementById("justifySelfSafeRight");
    checkValues(justifySelfSafeRight, "justifySelf", "justify-self", "", "safe right");
    var justifySelfUnsafeLeft = document.getElementById("justifySelfUnsafeLeft");
    checkValues(justifySelfUnsafeLeft, "justifySelf", "justify-self", "", "unsafe left");
    var justifySelfUnsafeFlexStart = document.getElementById("justifySelfUnsafeFlexStart");
    checkValues(justifySelfUnsafeFlexStart, "justifySelf", "justify-self", "", "unsafe flex-start");
    var justifySelfSafeFlexEnd = document.getElementById("justifySelfSafeFlexEnd");
    checkValues(justifySelfSafeFlexEnd, "justifySelf", "justify-self", "", "safe flex-end");
}, "Test getting justify-self set through CSS.");

test(function() {
    element = document.createElement("div");
    document.body.appendChild(element);
    checkValues(element, "justifySelf", "justify-self", "", "auto");
}, "Test initial value of justify-self through JS");

test(function() {
    container = document.createElement("div");
    element = document.createElement("div");
    container.appendChild(element);
    document.body.appendChild(container);
    element.style.justifySelf = "center";
    checkValues(element, "justifySelf", "justify-self",  "center", "center");

    element.style.justifySelf = "unsafe start";
    checkValues(element, "justifySelf", "justify-self",  "unsafe start", "unsafe start");

    element.style.justifySelf = "safe flex-end";
    checkValues(element, "justifySelf", "justify-self",  "safe flex-end", "safe flex-end");

    element.style.justifySelf = "right";
    checkValues(element, "justifySelf", "justify-self",  "right", "right");

    element.style.justifySelf = "center";
    checkValues(element, "justifySelf", "justify-self",  "center", "center");

    element.style.justifySelf = "self-start";
    checkValues(element, "justifySelf", "justify-self",  "self-start", "self-start");

    element.style.justifySelf = "normal";
    checkValues(element, "justifySelf", "justify-self",  "normal", "normal");

    element.style.justifySelf = "auto";
    checkValues(element, "justifySelf", "justify-self",  "auto", "auto");

    container.style.display = "flex";
    element.style.justifySelf = "auto";
    checkValues(element, "justifySelf", "justify-self",  "auto", "auto");

    container.style.display = "grid";
    element.style.justifySelf = "auto";
    checkValues(element, "justifySelf", "justify-self",  "auto", "auto");

    element.style.justifySelf = "self-end";
    checkValues(element, "justifySelf", "justify-self",  "self-end", "self-end");
}, "Test getting and setting justify-self through JS");

test(function() {
    document.documentElement.style.justifySelf = "auto";
    checkValues(document.documentElement, "justifySelf", "justify-self",  "auto", "auto");
}, "Test 'auto' value resolution for the root node");

test(function() {
    container = document.createElement("div");
    element = document.createElement("div");
    container.appendChild(element);
    document.body.appendChild(container);

    checkBadValues(element, "justifySelf", "justify-self",  "auto safe");
    checkBadValues(element, "justifySelf", "justify-self",  "auto left");
    checkBadValues(element, "justifySelf", "justify-self",  "normal unsafe");
    checkBadValues(element, "justifySelf", "justify-self",  "normal stretch");
    checkBadValues(element, "justifySelf", "justify-self",  "baseline normal");
    checkBadValues(element, "justifySelf", "justify-self",  "baseline safe");
    checkBadValues(element, "justifySelf", "justify-self",  "baseline center");
    checkBadValues(element, "justifySelf", "justify-self",  "first baseline center");
    checkBadValues(element, "justifySelf", "justify-self",  "last baseline center");
    checkBadValues(element, "justifySelf", "justify-self",  "baseline last");
    checkBadValues(element, "justifySelf", "justify-self",  "baseline first");
    checkBadValues(element, "justifySelf", "justify-self",  "stretch unsafe");
    checkBadValues(element, "justifySelf", "justify-self",  "stretch right");
    checkBadValues(element, "justifySelf", "justify-self",  "unsafe unsafe");
    checkBadValues(element, "justifySelf", "justify-self",  "unsafe safe");
    checkBadValues(element, "justifySelf", "justify-self",  "center start");
    checkBadValues(element, "justifySelf", "justify-self",  "stretch unsafe");
    checkBadValues(element, "justifySelf", "justify-self",  "safe stretch");
    checkBadValues(element, "justifySelf", "justify-self",  "baseline safe");
    checkBadValues(element, "justifySelf", "justify-self",  "unsafe baseline");
    checkBadValues(element, "justifySelf", "justify-self",  "unsafe safe left");
    checkBadValues(element, "justifySelf", "justify-self",  "unsafe left safe");
    checkBadValues(element, "justifySelf", "justify-self",  "left safe unsafe safe");
    checkBadValues(element, "justifySelf", "justify-self",  "legacy start");
    checkBadValues(element, "justifySelf", "justify-self",  "legacy end");
    checkBadValues(element, "justifySelf", "justify-self",  "legacy right unsafe");
    checkBadValues(element, "justifySelf", "justify-self",  "legacy auto");
    checkBadValues(element, "justifySelf", "justify-self",  "legacy stretch");
    checkBadValues(element, "justifySelf", "justify-self",  "legacy");
    checkBadValues(element, "justifySelf", "justify-self",  "legacy left right");
    checkBadValues(element, "justifySelf", "justify-self",  "start safe");
    checkBadValues(element, "justifySelf", "justify-self",  "end unsafe");
}, "Test bad combinations of justify-self");

test(function() {
    container.style.display = "";
    checkInitialValues(element, "justifySelf", "justify-self", "center", "auto");
}, "Test the value 'initial'");

test(function() {
    container.style.display = "grid";
    checkInitialValues(element, "justifySelf", "justify-self", "safe left", "auto");
}, "Test the value 'initial' for grid containers");

test(function() {
    container.style.display = "flex";
    checkInitialValues(element, "justifySelf", "justify-self", "unsafe right", "auto");
}, "Test the value 'initial' for flex containers");

test(function() {
    container.style.display = "";
    element.style.position = "absolute";
    checkInitialValues(element, "justifySelf", "justify-self", "left", "auto");
}, "Test the value 'initial' for positioned elements");

test(function() {
    container.style.display = "grid";
    element.style.position = "absolute";
    checkInitialValues(element, "justifySelf", "justify-self", "right", "auto");
}, "Test the value 'initial' for positioned elements in grid containers");

test(function() {
    container.style.display = "flex";
    element.style.position = "absolute";
    checkInitialValues(element, "justifySelf", "justify-self", "end", "auto");
}, "Test the value 'initial' for positioned elements in grid containers");

test(function() {
    checkInheritValues("justifySelf", "justify-self", "end");
    checkInheritValues("justifySelf", "justify-self", "safe left");
    checkInheritValues("justifySelf", "justify-self", "unsafe center");
}, "Test the value 'inherit'");
</script>
